////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//   Software       :                                                         //
//   Layer          : SRC                                                     //
//   Package        :                                                         //
//   Component      :                                                         //
//                                                                            //
//   File           : CGlobal.h                                              //
//   Author         : RSO ( Rafael Sotomayor Brûlé )                          //
//   EMail          : rsotomayor@savtec.cl                                    //
//   Type           : C++ Source                                              //
//   Usage          :                                                         //
//   Purpose        : Definición de ATD  globales                             //
//                                                                            //
//                                                                            //
//   who when        what                                                     //
//   ~~~ ~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//   RSO 09-10-2010  Creation                                                 //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////


#ifndef __CGLOBAL_H__
#define __CGLOBAL_H__

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>

#include <iostream>
#include <string>

#include <queue>
#include <pthread.h>
#include <semaphore.h>
#include <stdint.h>


#define TIMEOUT_CHECK_SERVER       360 
#define TIMEOUT_CHECK_SCANNER       60
#define TIMEOUT_SEND_TRANSACCIONES  60 
#define TIMEOUT_SINCRONIZA         360 

#if defined(__TS4800__) 
  typedef long int myint;
#elif defined(__arm__) || defined(__i386__)
  typedef int myint;
#elif defined(Ubuntu)
  typedef int myint;
#else
  typedef int myint;
#endif

#if defined(__arm__) || defined(__i386__)
#define MYUINTFORMAT "%llu" 
#else
#define MYUINTFORMAT "%lu" 
#endif

using namespace std;

class CGlobal {

public:
  CGlobal();
  virtual ~CGlobal();

  typedef struct {
    long int  ts;
    double latitud;
    double longitud;
    double altura;
    double velocidad;
    double rumbo;
  } tGeo ;

  typedef struct  {
      string    idacceso;
      string    idmodulo;
      string    idmovil;
      string    idresultado ;
      tGeo      geo;
      string    idusuario;
      string    idestado;
      string    opcion ;
      int       idfinger;
      int       score;
      string    idevento ;
      string    idtipoevento ;
    } tTransaccion ;

  typedef enum {
          e_IDLE=0,
          e_CONFIG
  } eEstado;

  typedef enum {
    e_POSTOK=0,
    e_POSTFAIL,
    e_CONNECTFAIL
  } tEstadoServidor;

  typedef struct {
    char     idacceso[32];
    char     idusuario[32];
    char     idevento[32];
    char     idtipoevento[32];
    char     idresultado[32];
    uint64_t idcard;
    int      idtipotransaccion; // 0 ENTRADA 1 // SALIDA // 2 CASINO
    int      opcion ; // OPCION DE MENU EN CASO DE CASINO -1 // No aplica
    int      idfinger;
    int      score  ;
    time_t   tStamp ;
  } tAcceso ;

  static      CGlobal *pCGlobal_a;
  static void myhandleSignal(int SignalNumber_p);
  int         startGeoServicio();
  int         readGeoData();
  virtual int notificaFalla(int id_p,string iddevice_p) = 0 ;
  virtual int displayMensaje(int id_p,string mensaje_p) = 0 ;
 

  time_t tCambioEstado_a;
  eEstado estado_a,estadoAnterior_a  ;
  void setEstado(eEstado estado_p);
  char *getStrEstado(eEstado estado_p);


  int         isOn_a;
  string      programName_a ;
  string      myconfigFile_a ;

  pthread_mutex_t   mutexEstado_a;


  pthread_mutex_t   mutEstadoServidor_a;

  tEstadoServidor   flagEstadoServidor_a,flagEstadoServidorAnterior_a ;
  tGeo   dataGeo_a ;

  pthread_mutex_t   mutQueue_a;
  sem_t             jobQueueCont_a;
  queue<tTransaccion>       queueTask_a;
  static void * procesaTrabajosTask(void *p);
  int           send2Server(tTransaccion transaccion_p);
  void          startTareas();
protected:
private:
} ;

#endif

